import { JsonConfigHelper } from "./JsonConfigHelper";
import { Condition, Levels } from "./ConfigStructures";
import { ConfigHelper } from "../app_base/module/config/ConfigHelper";

export enum ConfigPath {
    Level = "MainRes://config/Levels",
    Condition = "Common://Config/Condition",
    // Shop = "http://www.xxxx.com/gamename/config/shop.json"
}
/**
* @desc 配置管理中心,支持两种配置初始化方式：硬编码（快捷访问方式）、动态添加（通过get函数动态创建）
* 
* @author timoo
* @date 2022/12/24
* @class ConfigManager
*/
class ConfigManager {
    private _helperMap:Map<ConfigPath, JsonConfigHelper<any>> = new Map();

    /**
     * [硬编码] 等级配置快捷访问方式
     */
    get level():JsonConfigHelper<Levels>{
        return this.get(ConfigPath.Level);
    }

    /**
     * [硬编码] 条件配置快捷访问方式
     */
        get condition(): ConfigHelper<Condition> {
            return this.get(ConfigPath.Condition);
        }
    
    /**
     * [硬编码] 商店配置快捷访问方式
     */
    // get shop():ConfigHelper<ShopStructure>{
    //     return this.get(ConfigPath.Shop);
    // }

    /**
     * 动态创建并获取配置
     * @param {ConfigPath} path  配置路径
     * @param {{new(path?:string):JsonConfigHelper}} [clazz] 配置类
     * @returns 
     */
    get<T extends JsonConfigHelper<any>>(path:ConfigPath, clazz?:{new(path?:string):JsonConfigHelper<any>}):T{
        let helper:JsonConfigHelper<any> = this._helperMap.get(path);
        if(!helper){
            clazz = clazz || JsonConfigHelper;
            helper = new clazz(path);
            this._helperMap.set(path, helper);
        }
        return helper as T;
    }
}

/**
 * 配置管理中心,支持两种配置初始化方式：硬编码（快捷访问方式）、动态添加（通过get函数动态创建）
 */
export var G_Config = new ConfigManager();